@echo off

REM 设置控制台编码为UTF-8以正确显示中文
chcp 65001 > nul

setlocal enabledelayedexpansion

REM 设置默认值
set "env=dev"
set "service=first-case"
set "action=start"
set "java_opts=-Xms256m -Xmx512m -Dfile.encoding=UTF-8"

REM 获取脚本所在目录的绝对路径
set "SCRIPT_DIR=%~dp0"
set "BASE_DIR=%SCRIPT_DIR%.."
set "RUNTIME_DIR=%BASE_DIR%\runtime"

REM 优先检查帮助参数
if "%1"=="-h" goto help
if "%1"=="--help" goto help
if "%1"=="/?" goto help

REM 直接检查常用操作参数
if "%1"=="--status" (set action=status & goto init_vars_for_status)
if "%1"=="-status" (set action=status & goto init_vars_for_status)
if "%1"=="--stop" (set action=stop & goto init_vars_for_stop)
if "%1"=="-stop" (set action=stop & goto init_vars_for_stop)
if "%1"=="--start" (set action=start & goto after_parse)
if "%1"=="-start" (set action=start & goto after_parse)

REM 解析命令行参数
:parse_params
if "%~1"=="" goto after_parse

set "arg=%~1"
set "next_arg=%~2"

rem 处理参数
if "%arg%"=="-env" (if not "%next_arg%"=="" (set "env=%next_arg%" & shift & shift & goto parse_params))
if "%arg%"=="--env" (if not "%next_arg%"=="" (set "env=%next_arg%" & shift & shift & goto parse_params))
if "%arg%"=="-service" (if not "%next_arg%"=="" (set "service=%next_arg%" & shift & shift & goto parse_params))
if "%arg%"=="--service" (if not "%next_arg%"=="" (set "service=%next_arg%" & shift & shift & goto parse_params))
if "%arg%"=="-action" (if not "%next_arg%"=="" (set "action=%next_arg%" & shift & shift & goto parse_params))
if "%arg%"=="--action" (if not "%next_arg%"=="" (set "action=%next_arg%" & shift & shift & goto parse_params))
if "%arg%"=="-java-opts" (if not "%next_arg%"=="" (set "java_opts=%next_arg%" & shift & shift & goto parse_params))
if "%arg%"=="--java-opts" (if not "%next_arg%"=="" (set "java_opts=%next_arg%" & shift & shift & goto parse_params))

rem 未知参数处理 - 使用更简单的方法
set "is_valid_param=false"

rem 检查是否是已知参数
if "%arg%"=="-env" set is_valid_param=true
if "%arg%"=="--env" set is_valid_param=true
if "%arg%"=="-service" set is_valid_param=true
if "%arg%"=="--service" set is_valid_param=true
if "%arg%"=="-action" set is_valid_param=true
if "%arg%"=="--action" set is_valid_param=true
if "%arg%"=="-java-opts" set is_valid_param=true
if "%arg%"=="--java-opts" set is_valid_param=true
if "%arg%"=="-h" set is_valid_param=true
if "%arg%"=="--help" set is_valid_param=true
if "%arg%"=="/?" set is_valid_param=true
if "%arg%"=="--start" set is_valid_param=true
if "%arg%"=="-start" set is_valid_param=true
if "%arg%"=="--stop" set is_valid_param=true
if "%arg%"=="-stop" set is_valid_param=true
if "%arg%"=="--status" set is_valid_param=true
if "%arg%"=="-status" set is_valid_param=true

rem 如果不是已知参数，显示错误并退出
if "%is_valid_param%"=="false" (
    echo 错误: 未知参数: %arg%
    echo 请使用 -h 或 --help 查看可用参数
    echo.
    exit /b 1
)

shift
goto parse_params

:init_vars_for_status
set "JAR_FILE=%RUNTIME_DIR%\%service%-1.0-SNAPSHOT.jar"
set "PID_FILE=%RUNTIME_DIR%\%service%.pid"
set "already_initialized=true"
goto check_service_status

:init_vars_for_stop
set "PID_FILE=%RUNTIME_DIR%\%service%.pid"
goto stop_service

:after_parse

rem 在解析完所有参数后，根据操作类型直接跳转
rem 避免重复初始化
if "!action!"=="status" if not defined already_initialized goto init_vars_for_status
if "!action!"=="stop" goto init_vars_for_stop

:show_brief_info
REM 仅在非status和stop操作时显示操作信息
if not "%action%"=="status" if not "%action%"=="stop" (
    echo.
    echo 当前操作: %action% 服务: %service% 环境: %env%
    echo 使用 "%~nx0 -h" 查看帮助信息
    echo.
)
goto process_action

:process_action
set "JAR_FILE=%RUNTIME_DIR%\%service%-1.0-SNAPSHOT.jar"
set "PID_FILE=%RUNTIME_DIR%\%service%.pid"
set "LOG_FILE=%RUNTIME_DIR%\logs\%service%-%env%.log"
set "ENV_CONFIG_DIR=%BASE_DIR%\environment"
set "RUNTIME_ENV_DIR=%RUNTIME_DIR%\environment"

:start_service
rem 执行启动操作

REM 检查日志目录是否存在，不存在则创建
if not exist "%RUNTIME_DIR%\logs" mkdir "%RUNTIME_DIR%\logs"

REM JAR文件路径检测
echo.
echo [检查] 正在检查运行目录: %RUNTIME_DIR%

REM 检查JAR目录是否存在
if not exist "%RUNTIME_DIR%" (
    echo [错误] 运行目录不存在: %RUNTIME_DIR%
    echo [提示] 请先执行 mvn clean package 构建项目
    exit /b 1
) else (
    echo [成功] 运行目录已找到: %RUNTIME_DIR%
)

REM 检查JAR文件是否存在
echo [检查] 正在检查JAR文件: %JAR_FILE%
if not exist "%JAR_FILE%" (
    echo [错误] JAR文件不存在: %JAR_FILE%
    echo [提示] 请检查服务名称 '%service%' 是否正确
    
    REM 显示可用的JAR文件
    echo [提示] 可用的JAR文件:
    dir "%RUNTIME_DIR%\*.jar" /b
    
    exit /b 1
)
echo [成功] JAR文件已找到: %JAR_FILE%

REM 环境配置文件检查
echo.
echo [检查] 正在检查环境配置文件和目录

if exist "%ENV_CONFIG_DIR%" (
    echo [成功] 环境配置目录已找到: %ENV_CONFIG_DIR%
) else (
    echo [警告] 环境配置目录不存在: %ENV_CONFIG_DIR%
    echo [提示] 将使用默认配置启动服务
)

if exist "%RUNTIME_ENV_DIR%" (
    echo [成功] 运行时环境目录已找到: %RUNTIME_ENV_DIR%
) else (
    echo [警告] 运行时环境目录不存在: %RUNTIME_ENV_DIR%
    echo [提示] 正在创建运行时环境目录:
    mkdir "%RUNTIME_ENV_DIR%"
    echo [成功] 运行时环境目录已创建
)

REM 检查Java安装
echo Checking Java installation...
java -version >nul 2>&1
if %ERRORLEVEL% neq 0 (
    echo [错误] Java未安装或未在PATH中配置
    echo [提示] 请先安装Java并配置环境变量
    exit /b 1
)
echo [成功] Java检测成功

REM 复制环境配置文件
if exist "%ENV_CONFIG_DIR%\%env%" (
    echo [检查] 正在复制环境配置文件: %ENV_CONFIG_DIR%\%env%\*
    copy "%ENV_CONFIG_DIR%\%env%\*" "%RUNTIME_ENV_DIR%" /Y >nul
    if %ERRORLEVEL% equ 0 (
        echo [成功] 环境配置文件已成功复制到运行时目录
    ) else (
        echo [警告] 未复制环境配置文件，将使用默认配置启动
    )
) else (
    echo [警告] 未找到环境配置: %ENV_CONFIG_DIR%\%env%
)

REM 准备启动命令
set "JVM_OPTS=%java_opts%"
set "SPRING_PROFILES_ACTIVE=%env%"
set "CONFIG_LOCATIONS=--spring.config.location=classpath:/,file:../environment/,file:../runtime/environment/"

REM 准备启动服务
echo.
echo ==================================================
echo 正在启动服务: %service%
echo 环境: %env%
echo JAR文件: %JAR_FILE%
echo ==================================================
REM 自动启动服务，无需用户交互


REM 启动Java应用
echo Starting service...

REM 修复启动命令 - 使用简单的语法
echo Starting: java %JVM_OPTS% -Dspring.profiles.active=%SPRING_PROFILES_ACTIVE% -jar "%JAR_FILE%" %CONFIG_LOCATIONS%
start "%service% Service" java %JVM_OPTS% -Dspring.profiles.active=%SPRING_PROFILES_ACTIVE% -jar "%JAR_FILE%" %CONFIG_LOCATIONS%

REM 记录PID到PID文件 - 更可靠的方法
REM 使用更简单的方法获取进程ID，不使用CSV格式
for /f "tokens=2" %%p in ('tasklist /v /fi "windowtitle eq %service% Service" /fo table /nh ^| findstr /i "java"') do (
    echo %%p > "%PID_FILE%"
    echo [成功] 服务PID已记录到: %PID_FILE%
    echo [成功] 记录的PID值: %%p
    goto pid_recorded
)
:pid_recorded

echo Service started successfully!
echo.
echo [提示] 使用命令: "%~nx0" --stop 停止服务
goto :eof

:help
@echo off
echo.
echo ============================================
echo           多环境微服务启动脚本帮助            
echo ============================================
echo 用途: 用于启动、停止和检查微服务的运行状态

echo 使用方式:
echo   %0 [操作选项] [环境选项] [服务选项]

echo 操作选项:
echo   --start, -start           启动服务 (默认)
echo   --stop, -stop             停止服务
echo   --status, -status         检查服务状态
echo   -h, --help, /?            显示此帮助信息

echo 环境选项:
echo   --env, -env [环境名]      指定运行环境 (默认: dev)
echo                           可选值: dev, test, prod

echo 服务选项:
echo   --service, -service [服务名] 指定要操作的服务 (默认: first-case)
echo                           可选值: first-case, second-case

echo JVM选项:
echo   --java-opts [参数]        自定义JVM参数 (可选)

echo 示例:
echo   %0                         以默认配置启动服务
echo   %0 -env test               在测试环境启动服务
echo   %0 -service second-case    启动第二个服务
echo   %0 -stop                   停止服务
echo   %0 -status                 检查服务状态
echo   %0 -java-opts "-Xms512m -Xmx1024m" 自定义JVM参数启动服务

echo ============================================
exit /b 0

:stop_service
REM 停止服务功能
set "PID_FILE=%RUNTIME_DIR%\%service%.pid"

echo.
echo ============================================
echo         服务停止操作               
echo ============================================
echo 正在停止服务: %service%

set "FOUND=false"

REM 首先检查PID文件
if exist "%PID_FILE%" (
    set /p PID=<"%PID_FILE%"
    echo [检查] 从PID文件读取进程ID: !PID!
    
    REM 检查进程是否存在
    tasklist /fi "PID eq !PID!" /fo csv /nh >nul
    if %ERRORLEVEL% equ 0 (
        echo [操作] 正在终止进程 !PID!
        taskkill /pid !PID! /f >nul
        if %ERRORLEVEL% equ 0 (
            echo [成功] 服务进程已终止
            del "%PID_FILE%" >nul
            echo [成功] PID文件已删除
        ) else (
            echo [错误] 无法终止进程 !PID!
        )
    ) else (
        echo [警告] PID !PID! 不存在，删除无效PID文件
        del "%PID_FILE%" >nul
    )
)

REM 同时尝试通过服务名称查找并停止
REM 检查是否有包含服务名称的Java进程
tasklist /fi "imagename eq java.exe" /fo csv /nh | findstr /i "%service%" >nul
if %ERRORLEVEL% equ 0 (
    echo [操作] 正在查找并终止包含服务名的Java进程
    taskkill /f /im java.exe /fi "imagename eq java.exe" /fi "windowtitle eq *%service%*" >nul 2>&1
    if %ERRORLEVEL% neq 0 (
        echo [警告] 无法通过窗口标题找到进程，尝试其他方法
        taskkill /f /im java.exe /fi "imagename eq java.exe" >nul 2>&1
        echo [提示] 已尝试终止所有Java进程
    )
) else (
    echo [提示] 未找到包含服务名的Java进程
)

echo ============================================
echo 服务停止操作已完成
echo ============================================
exit /b 0

:check_service_status
REM 简化的服务状态检查功能
echo ============================================
echo            服务状态检查                        
echo ============================================
echo 正在检查服务: %service%
echo 环境: %env%

REM 检查JAR文件是否存在
if exist "%JAR_FILE%" (
    echo [检查] JAR文件存在: %JAR_FILE%
) else (
    echo [警告] JAR文件不存在: %JAR_FILE%
)

REM 显示服务未运行状态
echo.
echo ============================================
echo [状态] 服务 %service% (环境: %env%) 未运行
echo [提示] 使用命令: %0 启动服务
echo ============================================

exit /b 0

:end
endlocal